import { computeColumnWidth } from '@/plugins/util'
import useDictionaryStore from '@/stores/dictionary'
import { onMounted } from 'vue'

/**
 * 获取数据字典值信息（名称/宽度）
 * @param parentDictionaryValue 父级字典值
 */
export function useGetDictionaryInfo(parentDictionaryValue: string) {
  const dictionaryStore = useDictionaryStore()

  onMounted(async () => {
    await dictionaryStore.getDictionary(parentDictionaryValue)
  })

  /**
   * 通过字典值映射字典名称
   * @param dictionaryValue 字典值
   * @param defaultName 默认值
   */
  function getDictionaryNameByValue(
    dictionaryValue: string,
    defaultName: string = '',
  ) {
    if (!dictionaryValue) return defaultName
    // 获取缓存的字典数据
    const dictionary = dictionaryStore.map.get(parentDictionaryValue)

    let name = defaultName
    // 从数据字典中查找当前字典值对应的名称
    if (dictionary) {
      for (const item of dictionary) {
        if (item.dictionaryValue === dictionaryValue) {
          name = item.dictionaryCode
          break
        }
      }
    }
    return name
  }

  /**
   * 根据表格数据和指定的列属性，计算列的合适宽度
   * 该函数通过分析表格中每一行数据在指定列的文本宽度，来动态调整列宽
   * 这样可以确保列宽足够显示所有文本，同时不会浪费过多空间
   *
   * @param tableData 表格数据，是一个对象数组，每个对象代表一行数据
   * @param prop 指定列的属性，可以是字符串或数字，用于从每行数据中提取文本
   * @param minWidth 列的最小宽度，默认为85，确保列宽不会过窄
   * @param padding 文本的内边距，默认为24，用于计算列宽时考虑文本与列边界的间隔
   * @returns 返回计算出的列宽，确保所有文本都能显示且符合最小宽度要求
   */
  function getColumnDictionaryWidth(
    tableData: Record<string, any>[],
    prop: string,
    minWidth = 85,
    padding = 30,
  ) {
    return computeColumnWidth(
      tableData,
      prop,
      minWidth,
      padding,
      getDictionaryNameByValue,
    )
  }

  return {
    getColumnDictionaryWidth,
    getDictionaryNameByValue,
  }
}
